# 参考链接 https://mp.weixin.qq.com/s/ZYwxyB_Sc7d9RpvHRCEfkQ
# 分析后的步骤：
# 将 空白合同 调整成 合同模板，需要填写的下划线改成专属的列名
# 打开Excel表，按行循环，然后按单元格逐个循环各个信息，每个信息都找到模板中存在的对应列名并将其替换（如果不理解下文还有解释）
# 每次循环完一行的全部单元格后保存合同，生存各个公司单独的合同

# 本次的案例具有较强的实用性，并且需求可以延伸成为：
# 将一份信息汇总表Excel中的每一个单独信息(每一行或者每一列为个人、公司或者其他的信息)填写到指定的模板Eord中，
# 生成单独的文档，不过在写自动化脚本之前也要先拆分任务，明确思路再进行！

from docx import Document
from openpyxl import load_workbook
import os

path = f'{os.getcwd()}/data'
# 保存所有合同的文件夹
new_dir = '全部合同'
if not os.path.exists(path + '/' + new_dir):
    os.mkdir(path + '/' + new_dir)

# 打开excel文件
workbook = load_workbook(path + '/合同信息表.xlsx')
sheet = workbook.active
print(sheet)

# 遍历excel
# 有效信息行是从第二行开始的，第二行是表头，包含列名，也是文本替换的依据
for row in range(2, sheet.max_row + 1):
    # 每循环一行实例化一个新的word文件
    word = Document(path + '/' + '合同模板.docx')
    for col in range(1, sheet.max_column + 1):
        title_text = str(sheet.cell(row=1, column=col).value)
        new_text = str(sheet.cell(row=row, column=col).value)
        # 加上这个判断是因为日期信息读进程序是“日期 时间”格式的，
        # 如果要保留日期信息可以用字符串方法或者用time/datetime模块处理
        if ' ' in new_text:
            new_text = new_text.split()[0]
        # 文档Document - 段落Paragraph - 文字块Run
        ps = word.paragraphs
        for p in ps:
            for run in p.runs:
                run.text = run.text.replace(title_text, new_text)
        # 文档Document - 表格Table - 行Row/列Column - 单元格Cell
        ts = word.tables
        for t in ts:
            for t_row in t.rows:
                for cell in t_row.cells:
                    cell.text = cell.text.replace(title_text, new_text)
    # 获取公司名用以生成合同的名称
    company = str(sheet.cell(row=row, column=1).value)
    word.save(path + '/' + f'全部合同/{company}合同.docx')
